package Offer12_矩阵中的路径;

/**
 * -----------------------------------------------------------------------------------------------
 * 题目：
 *      给定一个m x n 二维字符网格board 和一个字符串单词word 。
 *      如果word 存在于网格中，返回 true ；否则，返回 false 。
 *      单词必须按照字母顺序，通过相邻的单元格内的字母构成，
 *      其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。
 *      同一个单元格内的字母不允许被重复使用。
 * -----------------------------------------------------------------------------------------------
 * 示例：
 *      输入：board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
 *      输出：true
 * -----------------------------------------------------------------------------------------------
 * 方法：
 *      回溯+dfs
 * -----------------------------------------------------------------------------------------------
 */
class Solution {
    public static void main(String[] args) {
        char[][] board = new char[][]{{'A','B','C','E'},{'S','F','C','S'},{'A','D','E','E'}};
        String word = "ABCCED";
        System.out.println(exist(board,word));
    }
    public static boolean exist(char[][] board, String word) {
        for(int i=0;i<board.length;++i){
            for(int j=0;j<board[0].length;++j){
                if(dfs(board,word,i,j,0)){
                    return true;
                }
            }
        }
        return false;
    }
    public static boolean dfs (char[][] board,String word,int i,int j,int index){
        if(i<0||j<0||i>=board.length||j>=board[0].length||word.charAt(index)!=board[i][j]){
            return false;
        }
        if(index==word.length()-1){
            return true;
        }
        board[i][j]='\0';
        boolean flag = dfs(board,word,i+1,j,index+1)||dfs(board,word,i-1,j,index+1)||dfs(board,word,i,j+1,index+1)||dfs(board,word,i,j-1,index+1);
        board[i][j]=word.charAt(index);
        return flag;
    }
}